#include<bits/stdc++.h>//P29
using namespace std;
const int N=1e6+5;
int heap[N],len=0;//len表示节点个数
void push(int x){//上浮，插入新元素
    heap[++len]=x;
    int i=len;
    while(i>1&&heap[i]<heap[i/2]){
        swap(heap[i],heap[i/2]);
        i=i/2;
    }
}
void pop(){//下沉，删除堆头，调整堆
    heap[1]=heap[len--];//根节点替换为最后一个节点，节点数量减一
    int i=1;
    while(2*i<=len){//至少有左儿子
        int son=2*i;
        if(son<len&&heap[son+1]<heap[son])//son<len表示有右儿子，选儿子较小的
            son++;
        if(heap[son]<heap[i]){//将较小的儿子与父节点比较，如果小，则交换并下沉到儿子处
            swap(heap[son],heap[i]);
            i=son;
        }
        else break;
    }
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int op;scanf("%d",&op);
        if(op==1){int x;scanf("%d",&x);push(x);}
        else if(op==2)printf("%d\n",heap[1]);
        else pop();
    }
    return 0;
}